package com.example;

import java.lang.reflect.Array;
import java.util.stream.Stream;

/**
 * @author zhangs
 * @version v1.0
 * @decription 泛型数组创建
 * @date 2021/4/7 20:22
 **/
public class GenArray {
    static class Demo<T, Q> {
        T[] ts;
        Object[] qs;
        int size = 10;

        @SuppressWarnings("unchecked")
        public Demo() {
            // 在创建数组的时候进行类型转换
            this.ts = (T[]) new Object[size];

            // 创建Object数组，在使用时进行强转
            this.qs = new Object[size];
        }

        public T getT(int index) {
            return ts[index];
        }

        public void setT(int index, T t) {
            this.ts[index] = t;
        }

        @SuppressWarnings("unchecked")
        public Q getQs(int index) {
            // 在获取时进行强制转换
            return (Q) qs[index];
        }

        public void setQs(int index, Q q) {
            this.qs[index] = q;
        }
    }

    static class Demo0 {
        @SuppressWarnings("unchecked")
        public static <T> T[] getArray(Class<T> componentType, int length) {
            // 返回了一个泛型的数组，虽然有泛型的擦除,
            // 但是在构造器中传递了类型标记Class，可以从擦除中恢复
            return (T[]) Array.newInstance(componentType, length);
        }

        public static void main(String[] args) {
            Integer[] array = getArray(Integer.class, 10);
            // 往数组中存值
            for (int i = 0; i < array.length; i++) {
                array[i] = i;
            }
            // 打印
            Stream.of(array).forEach(System.out::println);
        }
    }
}
